iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
自我挑戰組

環島C一下自己的人生系列 第 11

[Day11]中序轉後序

  • 分享至 

  • xImage
  •  

今天來介紹中序轉後序好了~~
在我們平常的日常生活中看到的式子都是以 a+bd-c/d
然而在電腦運算時,為了更有效率的判斷運算順序,可以將中序表示法換成後序或前序
而轉到後序後的式子為abd
+cd/-
而運算元為abcd,運算子為*/+-
那麼他的規則有兩個

  1. 遇到運算元直接輸出
  2. 遇到運算子放入stack,如果stack中operator優先等於則放入stack中,如果opearator比較高則直接輸出stack中並將該operator再放入stack中
  3. pop all
元素 Stack Output
a a
+ a
b + ab
+* ab
d +* abd
- abd*+
c - abd*+c
/ -/ abd*+c
d -/ abd*+cd
pop all pop all abd*+cd/-

掌握了以上三個原則即可開始
其中還要考慮()的部分
如果遇到()時則需將stack中的所以元素pop出來

#include <stdio.h>
#include <stdlib.h>
int priority(char op){
    switch(op){
        case'+': case'-': return 1;
        case'*': case'/': return 2;
        case'^': return 3;
        default: return 0;
    }
}
void intopost(char *infix,char *postfix){
    char stack[512]={'\0'};
    int i,j,top;
    for(i=0,j=0,top=0;infix[i]!='\0';i++){
        switch(infix[i]){
            case '(':
                stack[++top]=infix[i];
                break;
            case'+':case'-':case'*':case'/':case'^':
                while(priority(stack[top]) >= priority(infix[i]) ){
                    postfix[j++]=stack[top--];
                }
                stack[++top]=infix[i];
                break;
            case ')':
                while(stack[top]!='('){
                    postfix[j++]=stack[top--];
                }
                top--;
                break;
            default:
                postfix[j++]=infix[i];
                break;
        }
    }
    while(top>0){
        postfix[j++]=stack[top--];
    }
}
void main(){
    int i;
    char in[512]={'\0'},post[512]={'\0'};
    scanf("%s",in);
    intopost(in,post);
    for(i=0;post[i]!='\0';i++){
        printf("%c",post[i]);
    }
    printf("\n%s",post);

}

上一篇
[Day10]佇列Queue
下一篇
[Day12]選擇排序法
系列文
環島C一下自己的人生24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言